import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
//采用了线程池模拟并发，采用了atomicInteger来使并发处理相同变量不会发生安全性问题。同时对于底层相较于synchronize性能更好。由于atomic底层是对于硬件cpu和内存来实现数据安全。速度更快。
// 通过volatile独占内存、使其他处理器缓存失效，达到了“指令重排序无法越过内存屏障”的作用,实现了有序性和可见性，但volatile无法保证原子性，atomic变量通过CAS机制保证了原子性，同时基于cpu多核操作，实现阻塞队列。


public class AtomicSample {
    public static void main(String[] args) throws InterruptedException{
        ExecutorService service =  Executors.newFixedThreadPool(5);
        int i =0;
        Count count = new Count(i);
        for(int j =0;j<1000;j++){

            service.execute(()->count.increase());
//            System.out.println("这是自增操作第"+j+"次");
        }
        service.shutdown();
        service.awaitTermination(1, TimeUnit.MINUTES);//增加等待时间，使得程序可以等到所有线程都执行完成后现实最后结果。
        System.out.println("最后的结果是："+count.getVal());

    }
    public static class Count {
        private AtomicInteger i;
        public Count(int i){
            this.i = new AtomicInteger(i);
        }
        public void increase(){
            this.i.getAndIncrement();
        }
        public AtomicInteger getVal(){
            return this.i;
        }

    }
}
